home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_08 / plauger / isgetifl.c < prev    next >
C/C++ Source or Header  |  1994-06-09  |  1KB  |  46 lines

  1. --------------- Listing 7: member function _Getifld(char *) ---------
  2.  
  3. // isgetifl -- istream::_Getifld(char *)
  4. #include <string.h>
  5. #include <istream>
  6.  
  7. int istream::_Getifld(char ac[_MAX_INT_DIG])
  8.     {    // extract an integer field
  9.     char *p, seen;
  10.     int base, ch, dlen;
  11.     char *const pe = &ac[_MAX_INT_DIG-1];
  12.     const ios::fmtflags bfl = flags() & basefield;
  13.     static const char digits[] = "0123456789abcdefABCDEF";
  14.     p = ac, ch = rdbuf()->sbumpc();
  15.     if (ch == '+' || ch == '-')
  16.         *p++ = ch, ch = rdbuf()->sbumpc();
  17.     seen = 0;
  18.     base = bfl == oct ? 8 : bfl == hex ? 16
  19.         : bfl == _Fmtzero ? 0 : 10;
  20.     if (ch == '0')
  21.         {    // match possible prefix and strip it
  22.         seen = 1;
  23.         ch = rdbuf()->sbumpc();
  24.         if ((ch == 'x' || ch == 'X')
  25.             && (base == 0 || base == 16))
  26.             base = 16, ch = rdbuf()->sbumpc(), seen = 0;
  27.         else if (base == 0)
  28.             base = 8;
  29.         }
  30.     dlen = base == 0 || base == 10 ? 10 : base == 8 ? 8 : 16+6;
  31.     for (; ch == '0'; seen = 1)
  32.         ch = rdbuf()->sbumpc();
  33.     if (seen)
  34.         *p++ = '0';
  35.     for (; ch != EOF && memchr(digits, ch, dlen);
  36.         ch = rdbuf()->sbumpc(), seen = 1)
  37.         if (p < pe)
  38.             *p++ = ch;
  39.     if (ch != EOF)
  40.         rdbuf()->sputbackc(ch);
  41.     if (!seen)
  42.         p = ac;
  43.     *p = '\0';
  44.     return (base);
  45.     }
  46.